package control;

import java.awt.event.MouseEvent;

import service.AmService;
import ui.window.EditTextPanel;
import ui.window.FileChooserFrame;
import ui.window.MainFrame;
import ui.window.MainPanel;
import ui.window.SaveFrame;
import ui.window.WelcomePanel;
import dao.Data;
import dto.AmDto;
import entity.Node;

/**
 * 软件的控制层
 * 用于链接软件业务逻辑层(Service)和显示层(Ui)
 * 主要功能:
 *   1. 启动应用界面
 *   -----------------------------------------------
 *   2. 接受用户控制器(keyboardControl)传过来的用户输入
 *   3. 接受显示层的数据
 *   4. 接受业务逻辑层的数据
 *   5. 接受模型层(data)的数据
 *   -----------------------------------------------
 *   6. 将用户输入传递给业务逻辑层
 *   7. 将显示层数据传递给业务逻辑层
 *   8. 将业务逻辑层计算的结果传递给显示层
 *   9. 将模型层的数据传递给显示层
 *   -----------------------------------------------
 *   10. 刷新显示层
 *   
 * 总而言之,控制层是软件的主要枢纽,他不对数据进行任何处理,只负责数据的传递.同时负责不同窗口的显示隐藏
 * 控制层与显示层,控制层与业务逻辑层通讯的工具是dto
 * 
 * @author raymondwong
 *
 */
public class AmControl {

  /**
   * 数据访问接口
   */
  private Data data = null;
  
  /**
   * 全局键盘输入监听器
   */
  private KeyboardControl keyboardControl = null;
  
  /**
   * 全局鼠标输入监听
   */
  private MouseControl mouseControl = null;
  
  /**
   * 主窗口
   */
  private MainFrame mainFrame = null;
  
  /**
   * 主界面
   */
  private MainPanel mainPanel = null;
  
  /**
   * 欢迎界面
   */
  private WelcomePanel welcomePanel = null;
  
  /**
   * 编辑文本界面
   */
  private EditTextPanel editTextPanel = null;
  
  /**
   * 文件选择器窗口
   */
  private FileChooserFrame fileChooserFrame = null;
  
  /**
   * 保存提醒窗口
   */
  private SaveFrame saveFrame = null;
  
  /**
   * 业务逻辑层对象
   */
  private AmService amService = null;
  
  /**
   * 数据传输源对象
   */
  private AmDto amDto = null;
  
  /**
   * 检索线程
   */
  private Thread searchThread = null;
  
  /**
   * 检索线程的内部类
   * 
   * @author raymondwong
   *
   */
  private class MainThread extends Thread {
    @Override
    public void run() {
      // TODO 单独开一个线程来检索dto中所有等待检索的句子
    }
  }
  /**
   * 控制层构造函数
   */
  public AmControl() {
    // 创建数据传输源
    this.amDto = new AmDto();
    // 创建业务逻辑层对象,并将dto安装在服务层上
    this.amService = new AmService(amDto);
    // 创建全局键盘输入监听器
    this.keyboardControl = new KeyboardControl(this);
    // 创建全局鼠标输入监听器
    this.mouseControl = new MouseControl(this);
    // 创建文件选择器窗口
    this.fileChooserFrame = new FileChooserFrame(this, amDto);
    // 创建保存窗口
    this.saveFrame = new SaveFrame(this);
    // 创建欢迎界面
    this.welcomePanel = new WelcomePanel(this, amDto);
    // 创建主界面
    this.mainPanel = new MainPanel(this, amDto);
    // 创建编辑文本界面
    this.editTextPanel = new EditTextPanel(this, amDto);
    // 创建主窗口并安装欢迎界面和主界面
    this.mainFrame = new MainFrame(welcomePanel, mainPanel, editTextPanel);
  }
  
  /**
   * 界面刷新函数
   */
  public void repaint() {
  }
  
  /**
   * 显示文件选择器
   */
  public void showFileChooser() {
    // TODO 显示文件选择器
  }

  /**
   * 显示提示保存窗口
   */
  public void showSaveFrame() {
    // TODO 显示保存提醒窗口
  }
  
  /**
   * 打开文件
   * 
   * @return 文件是否打开成功
   */
  public boolean openFile() {
    // TODO 从dto中读取文件路径,调用dao接口打开文件,将文件中的节点数组传入dto中
    return false;
  }
  
  /**
   * 新建文件
   */
  public void newFile() {
    // TODO 新建一个文件
  }
  
  /**
   * 保存文件
   */
  public boolean saveFile() {
    // TODO 从dto中读取文件路径及节点数组,调用dao接口将项目保存到相应路径
    return false;
  }
  
  /**
   * 保存编辑后的文件 
   */
  public boolean saveEditing() {
    // TODO 保存编辑后的文件
    return false;
  }
  
  /**
   * 结束编辑文本并从编辑界面跳转至主界面
   */
  public void quitEditing() {
    // TODO 从编辑界面跳转到主界面
  }
  
  /**
   * 添加节点
   * 
   * @param newNode 需要添加进树的节点
   * @param leftBro
   *          为树中原本存在的节点,在该节点后面插入一个新的子节点 该节点用于定位新节点的位置
   * @return 是否添加成功
   */
  public boolean addNode(Node newNode, Node leftBro) {
    return this.amService.addNode(newNode, leftBro);
  }

  /**
   * 从树中删除一个节点
   * 
   * @param node 需要删除的节点对象
   * @return 是否删除节点成功
   */
  public boolean removeNode(Node node) {
    return this.amService.removeNode(node);
  }

  /**
   * 移动树中的node节点到leftBro的后面,作为leftBro节点的第一个右兄弟
   * 
   * @param node 需要移动的节点
   * @param leftBro 定位节点
   * @return 是否移动成功
   */
  public boolean moveNode(Node node, Node leftBro) {
    return this.amService.moveNode(node, leftBro);
  }
  
  /**
   * 导出项目成pdf或者doc格式
   * 
   * @param type 导出的格式
   * @return 根据节点内容生成的文章字符串
   */
  public void export(String type) {
    // TODO 调用dao接口将service处理过后返回的string存入doc中
  }
  
  /**
   * 标记检索函数
   * 
   * @param sentence 需要检索的句子
   */
  public void mark(String sentence) {
    // TODO 将参数中的句子添加进检索队列中
  }
  
  /**
   * 获取用户键盘输入
   * 
   * @param keyCode 用户键盘输入的键盘码
   */
  public void actionByKeyCode(int keyCode) {
    // TODO 主要用于相应ctrl键的按下
  }

  /**
   * 鼠标按下事件
   */
  public void mousePress(MouseEvent e) {
  }

  /**
   * 鼠标松开事件
   */
  public void mouseReleased(MouseEvent e) {
  }

  /**
   * 鼠标移动事件
   */
  public void mouseMoved(MouseEvent e) {
  }
  
}
